package pt.iscte.poo.freq20122013;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;

public class Mapa {
	private static final int DIFICULDADE_TORRE = -1;
	private List<Chao> caminho = new ArrayList<Chao>();
	private List<Chao> mapa = new ArrayList<Chao>();
	private Random random = new Random();

	public Mapa(String filename) throws FileNotFoundException {
		Scanner ficheiro = new Scanner(new File(filename));
		int j = 0;
		while (ficheiro.hasNext()) {
			String linha = ficheiro.nextLine();
			for (int i = 0; i < linha.length(); i++) {
				Chao c = null;
				Ponto posicao = new Ponto(i, j);
				if (linha.charAt(i) == 'X') {
					c = new TrocoDeCaminho(posicao, true, DIFICULDADE_TORRE);
				} else {
					int dificuldade = linha.charAt(i) - '0';
					c = new TrocoDeCaminho(posicao, false, dificuldade);
					// Insere troço na lista de caminhos
					caminho.add(c);
				}
				// insere troço na lista que contém todos os elementos do mapa
				mapa.add(c);
			}
			j++;
		}

	}

	// 1ª Solução usando uma lista que apenas contém os pontos do caminho
	public List<Chao> pontosContiguos(Ponto ponto) {
		List<Chao> resultado = new ArrayList<Chao>();
		for (Chao c : caminho) {
			Ponto p = c.posicao();
			if (Math.abs(p.getX() - ponto.getX()) == 1
					&& p.getY() == ponto.getY()) {
				resultado.add(c);
			} else if (Math.abs(p.getY() - ponto.getY()) == 1
					&& p.getX() == ponto.getX()) {
				resultado.add(c);
			}
		}
		return resultado;
	}

	// 2ª Solução usando uma lista que contém todos os pontos do mapa.
	public List<Chao> pontosContiguosMapa(Ponto ponto) {
		List<Chao> resultado = new ArrayList<Chao>();
		for (Chao c : mapa) {
			Ponto p = c.posicao();
			if (!c.podeCriarTorre()) {
				if (p.dist(ponto) == 1) {
					resultado.add(c);
				}
			}
		}
		return resultado;
	}

	public boolean consegueMoverDe(TrocoDeCaminho troco) {
		int valor = random.nextInt(troco.dificuldadeEmAtravessar());
		return valor == 0;
	}
	
	@Override
	public String toString() {
		return mapa.toString();
	}
}
